package com.clstu.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 演示反射机制调用方法
 */
public class ReflectAccessMethod {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class<?> bossCls = Class.forName("com.clstu.reflection.Boss");
        Object o = bossCls.newInstance();

        //得到方法对象
        Method hi = bossCls.getMethod("hi",String.class);
        Method hi1 = bossCls.getDeclaredMethod("hi", String.class);
        System.out.println(hi == hi1);//虽然不一样,但是都是一样的方法,一样的使用
        hi.invoke(o,"hello");
        hi1.invoke(o,"world");

        //得到私有方法对象   只能用getDeclareMethod得到,因为是私有的
        Method declaredMethod = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);

        //私有方法,访问前需要先对其进行爆破(setAccessible(ture))
        declaredMethod.setAccessible(true);
        //需要注意的是,在反射中,不论方法的返回类型是什么,统一用Object类来接受,
        // 运行类型肯定是不变的,仍然是方法的返回类型
        Object invoke = declaredMethod.invoke(o, 20, "张三", '男');//char 类型只能用单引号引用
        Object invoke1 = declaredMethod.invoke(null, 20, "张三", '男');//static方法,o可以用null代替,即可以不需要对象
        System.out.println(invoke);
        System.out.println(invoke1);



    }
}
class Boss{
    public int age ;
    private static String name ;

    private static String say(int n ,String s ,char c){
        return n+"  "+ s+"  "+c;
    }

    public void hi(String s ){
        System.out.println("hi "+ s);
    }
}